/**
 * 版权所有 2009-2012山东新北洋信息技术股份有限公司
 * 保留所有权利。
 */
package com.linyaonan.leetcode.easy._283;

/**
 *
 * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
 *
 * 示例:
 *
 * 输入: [0,1,0,3,12]
 * 输出: [1,3,12,0,0]
 * 说明:
 *
 * 必须在原数组上操作，不能拷贝额外的数组。
 * 尽量减少操作次数。
 *
 *
 * @ProjectName: leetcode
 * @Package: com.linyaonan.leetcode.easy._283
 * @ClassName: MoveZeroes
 * @Author: linyaonan
 * @Date: 2019/12/18 17:53
 */
public class MoveZeroes {

    public void moveZeroes(int[] nums) {
        int i = 0;
        int j = 0;
        while (i < nums.length) {
            if (nums[i] != 0) {
                nums[j] = nums[i];
                j++;
            }
            i++;
        }
        for (int i1 = j; i1 < nums.length; i1++) {
            nums[i1] = 0;
        }
    }

    /**
     * 类似双指针法，指针1正常进行遍历，指针2用来存放非零数据，指针1遍历完成后指针2往后全部填0
     * @param nums
     */
    public void moveZeroes2(int[] nums) {
        // 1. 异常边界
        if (nums == null || nums.length == 0) {
            return;
        }
        // 2. 正常遍历，将非零的数据依次填充到数据左侧
        int l = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[l] = nums[i];
                l++;
            }
        }
        // 3. 剩余数据填充0
        for (int i = l; i < nums.length; i++) {
            nums[i] = 0;
        }
    }
}
